package com.example.elasticsearch.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;

/**
 * Copyright(C), 2020-2021, AmbroseCdMeng
 * FileName:    Product
 * Author:      AmbroseCdMeng
 * Date:        2021/3/3 13:19
 * Description: 创建实体。实体根据类信息自动生成，也可以手动指定索引名称。
 *              ElasticsearchTemplate 中提供了创建索引的 API。
 *              这里因为是本机测试，没有集群，所以 replicas 副本先设置为 0
 * History:
 * <author>     <time>      <version>       <desc>
 * 作者姓名     修改时间        版本号           描述
 */
// 索引名称类似于其他关系型数据库中的数据库名称，必须是小写
// type 类似于其他关系型数据中的表名。在 7.x 版本中已经过时
@Document(indexName = "ec", type = "product", replicas = 0, shards = 5)
@Data
@AllArgsConstructor
@ToString
public class Product implements Serializable {
    /**
     * Description: @Id 注解须是 springframework 包下的 "org.springframework.data.annotation.Id"
     */
    @Id // 作用于成员变量，标记一个字段作为 id 主键
    private Long id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")   // ik_max_word 使用 ik 分词器
    private String name;

    @Field(type = FieldType.Keyword)    // 在存储数据是，不会对其进行分词
    private String category;

    @Field(type = FieldType.Double)
    private Double price;

    @Field(type = FieldType.Keyword, index = false) // index = false 表示不建立索引
    private String images;

    private String body;
}

/*
    - @Id 注解： 作用于成员变量，标记一个字段作为 id 主键
    - @Field 注解： 作用于成员变量，标记为文档的字段，需要指定字段映射属性 type

    - index： 是否索引，布尔类型，默认 true
    - store： 是否存储，布尔类型，默认 false
    - analyzer： 分词器名称，这里的 ik_max_word 指的就是使用 IK 分词器
 */
